I using a Xamarin Forms ListView and I want to enable or disable the Context Actions based on a certain binding or in the code behind.
The way I found is to use BindingContextChanged in a ViewCell. I show you an example
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="https://xamarin.com/schemas/2014/forms"
xmlns:x="https://schemas.microsoft.com/winfx/2009/xaml">
<ContentPage.Content>
<StackLayout>
<ListView x:Name="listDictionaries"
ItemsSource="{Binding DictionariesList}"
IsVisible="{Binding ShowList}"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
HasUnevenRows="true"
IsPullToRefreshEnabled="true"
RefreshCommand="{Binding Refresh}"
SeparatorVisibility="Default"
ItemTapped="OnItemTapped"
IsRefreshing="{Binding IsBusy, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell BindingContextChanged="OnBindingContextChanged">
<ViewCell.View>
<StackLayout>
<Grid Padding="10" ColumnSpacing="10">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Text="{Binding Name}" FontSize="Large"
Grid.Row="0" Grid.Column="0" />
<Label Text="{Binding Description}" FontSize="Small"
Grid.Row="1" Grid.Column="0" />
</Grid>
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage.Content>
</ContentPage>
Then you insert in the code the following code:
/// <summary>
/// Called when binding context changed.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="EventArgs"/>
/// instance containing the event data.</param>
private void OnBindingContextChanged(object sender, EventArgs e) {
base.OnBindingContextChanged();
if (BindingContext == null)
return;
ViewCell theViewCell = ((ViewCell)sender);
var item = theViewCell.BindingContext as DictionaryModel;
theViewCell.ContextActions.Clear();
if (item != null) {
MenuItem mn = new MenuItem();
mn.Clicked += Menu_Clicked;
mn.Text = "Delete";
mn.IsDestructive = true;
mn.CommandParameter = item.Id;
theViewCell.ContextActions.Add(mn);
}
}
private async void Menu_Clicked(object sender, EventArgs e) {
var mi = ((MenuItem)sender);
}
Happy coding!